﻿#define _CRT_SECURE_NO_WARNINGS 1

//const修饰成员函数
//将const修饰的成员函数称之为const成员函数，const修饰成员函数放到成员函数参数列表的后⾯。
//const实际修饰该成员函数隐含的this指针，表明在该成员函数中不能对类的任何成员进⾏修改。
//const 修饰Date类的Print成员函数，Print隐含的this指针由 Date* const this 变为 const Date* const this
#include<iostream>
using namespace std;
//class Date
//{
//public:
//	Date(int year = 1, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	void Print()
//	{
//		cout << _year << "-" << _month << "-" << _day << endl;
//	}
//	// void Print(const Date* const this) const
//	void Print() const
//	{
//		cout << _year << "-" << _month << "-" << _day << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	// 这⾥⾮const对象也可以调⽤ const成员函数是⼀种权限的缩⼩
//	Date d1(2024, 7, 5);
//	d1.Print();
//	const Date d2(2024, 8, 5);  //如果不重载一个const修饰的Print函数，直接对const修饰的对象调用该函数会报错，涉及到权限放大 将const Date* 传给Date*
//	d2.Print();
//	return 0;
//}


//取地址运算符重载
//取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载
//一些特殊场景，比如我们不想让别人取到当前类对象的地址时，可以重载&运算符 返回空指针或者随机地址
class Date
{
public:
	Date* operator&()
	{
		return this;
		/*return nullptr;*/
		/*return (Date*)0x12ff4570;*/
	}
	const Date* operator&() const
	{
		return this;  //const修饰后this变为const Date* const this  于是返回类型也是const Date*类型
		/*return nullptr;*/
	}
private:
	int _year;
	int _month;
	int _day;
};